博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python web开发 框架 模板 MVC
阅读量:7091 次
发布时间:2019-06-28

本文共 6121 字,大约阅读时间需要 20 分钟。

我是跟着廖雪峰老师学习的,对于我这样的纯小白来说,跟着他的网站学习,简直是被妈妈抱在怀里一样无忧无虑,这样的学习本来没有记录下来的必要,但是由于我的粗心大意,经常会出现一些错误,所以我决定把这些错误记录下来,顺便把知识网络也记下来

网站地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432012393132788f71e0edad4676a3f76ac7776f3a16000

参考链接:https://aiohttp.readthedocs.io/en/stable/web_quickstart.html#run-a-simple-web-server

一、WSGI接口

  可以通过这个接口,将更复杂的HTTP协议交给模块处理,而只专注与web业务

  通过WSGI接口,只要求开发者实现一个函数,就能响应HTTP请求

  无多多么复杂的web应用程序,入口都是一个WSGI处理函数。HTTP请求的所有输入信息都可以通过 environ 获得,HTTP响应的输出都可以通过 start_response() 加上函数返回值作为Body

  复杂的web应用程序,光靠一个WSGI函数来处理还是太底层了,我们需要在WSGI之上在抽象出来一些框架,进一步简化Web开发

   

出现的问题:

  问题:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte

  解决办法:计算机名字是中文的,改成英文的

  

  问题:localhost 拒绝了我们的连接请求。

  解决办法:因为我是在虚拟环境里运行的程序,但是为了编辑方便,我就打开了IDLE(在IDLE里编辑,然后在命令行里运行)结果就出现了这个错误,把IDLE关了就好了

 

二、使用Web框架

  通过使用框架,能让我们只专注于一个函数处理一个URL,而不必关注与URL到函数之间的映射,则交给web框架去完成,web框架完成了在WSGI接口上进一步的抽象,有很多框架可以供我们使用,这里以Flask为例

  每个URL对应的GET和POST请求(当然还有其他的请求)都可以单独映射为两个函数处理或交给一个函数去处理,使用框架后,框架通过python的装饰器在内部自动的把不同的URL映射到相应的函数

  

from flask import Flaskfrom flask import requestapp=Flask(__name__)@app.route('/',methods=['GET','POST'])#路径和请求方式,默认是127.0.0.1,怎么配置别的我还不知道def home():    return '

Home

'@app.route('/signin',methods=['GET'])def singnin_form(): return'''
#action代表提交到的地址

'''@app.route('/signin',methods=['POST'])def singin(): #需要从request对象读取表单内容: if request.form['username']=='admin' and request.form['password']=='123':#获取表单内容的方式 return'

Hello admin

' return '

Bad username or password.

'if __name__=='__main__': app.run()

  在编写URL处理函数时,除了配置URL外,从HTTP请求拿到用户数据也是非常重要的。Web框架都提供了自己的API来实现这些功能。Flask通过 request.form['name'] 来获取表单的内容。

  教程地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432012745805707cb9f00a484d968c72dbb7cfc90b91000#0

 

出现的问题

  问题:按下表单按钮后没有反应,并且链接也变成了 http://127.0.0.1:5000/signin?username=admin&password= 

  解决办法:一开始为认为如果没有响应,那么一定是映射的问题(后来才知道其实还可能是部件写错了)。是以为对函数的映射出了问题,然后去找没有发现,后来经过与老师代码的比对才发现构建表单时的代码写错了

#action代表提交到的地址#应该是#action代表提交到的地址

  

三、使用模板

  通过字符串来构建web页面是不可行的,所以模板技术出现了。使用模板,我们必须先准备一个HTML文档,这个文档并不是普通的HTML文档,而是带有参数和变量的,然后根据我们传入的数据,替换后,得到最终的HTML,发给用户。

  这就是MVC(model-view-controller)模型视图 控制器

  控制器负责任务逻辑,比如登录时检查用户名和密码是否正确,python中处理URL的相应函数就是控制器

  视图就是用来展示给用户的界面,不过需要经过处理。需要填入一些我们的数据

  模型就是要向视图中填入的数据,是用来传给view的,view在替换变量的时候,就从model中取出相应的数据

  只是因为Python支持关键字参数,很多Web框架允许传入关键字参数,然后,在框架内部组装出一个dict作为Model。

  

使用:

  Flask通过 render_template() 函数来实现模板的渲染。和Web框架类似,Python的模板也有很多种。Flask默认支持的模板是,所以我们需要先直接安装jinja2

  在Jinja2模板中,我们用 {

{ name }} 表示一个需要替换的变量。很多时候,还需要循环、条件判断等指令语句,在Jinja2中,用 {% ... %} 表示指令。

from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])def home():    return render_template('home.html')--snip--

 

  然后,开始编写jinja2模板:

#代码见链接 #home.html 用来显示首页的模板:--snip--#form.html 用来显示登录表单的模板   Please Sign In  {% if message %}#命令  

{

{ message }}

#参数 {% endif %}
Please sign in:

#signin-ok.html登录成功的模板: --snip--

 

指令的使用方法实例  

{% for i in page_list %}#如果page_list是一个列表:1、2、3,下面代码会输出5个超链接    {
{ i }}
{% endfor %}

     

最后,一定要把模板放到正确的 templates 目录下, templates 和 app.py 在同级目录下,这个templates需要新建

通过MVC,我们在Python代码中处理M:Model(就是个性化的数据)和C:Controller,而V:View是通过模板处理的(由模板是大部分已经完成的,只是还需要些数据),这样,我们就成功地把Python代码和HTML代码最大限度地分离了。

 

遇到问题:

  问题:500 internal server error

 

Traceback (most recent call last):  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 2292, in wsgi_app    response = self.full_dispatch_request()  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request    rv = self.handle_user_exception(e)  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1718, in handle_user_exception    reraise(exc_type, exc_value, tb)  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\_compat.py", line 35, in reraise    raise value  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request    rv = self.dispatch_request()  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1799, in dispatch_request    return self.view_functions[rule.endpoint](**req.view_args)  File "./envs/web_go/app.py", line 21, in singin    return render_template('signin_ok.html',username=username)  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\templating.py", line 134, in render_template    return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list),  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\environment.py", line 869, in get_or_select_template    return self.get_template(template_name_or_list, parent, globals)  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\environment.py", line 830, in get_template    return self._load_template(name, self.make_globals(globals))  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\environment.py", line 804, in _load_template    template = self.loader.load(self, name, globals)  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\loaders.py", line 113, in load    source, filename, uptodate = self.get_source(environment, name)  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\templating.py", line 58, in get_source    return self._get_source_fast(environment, template)  File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\templating.py", line 86, in _get_source_fast    raise TemplateNotFound(template)jinja2.exceptions.TemplateNotFound: signin_ok.html127.0.0.1 - - [18/Mar/2019 14:23:12] "POST /signin HTTP/1.1" 500 -

  解决办法: 阅读错误信息,发现是目标页面的名字拼错了(要认真阅读提示)

转载于:https://www.cnblogs.com/Gaoqiking/p/10538842.html

你可能感兴趣的文章
Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机
查看>>
借鉴bootstrap的方法,快速实现响应式开发
查看>>
windows+python3.6下安装fasttext+fasttext在win上的使用+gensim(fasttext)
查看>>
C# 语法特性
查看>>
查询锁谁阻塞了谁
查看>>
zabbix报错整理--持续更新
查看>>
类和实例
查看>>
uglifyjs2全局混淆
查看>>
在centos上,oracle数据库更改IP后无法启动监听,解决方法
查看>>
JAVA语言基础组成(1)
查看>>
上架流程:(0)上架流程
查看>>
vim 代码提示功能,让vim可以媲美IDE(转)
查看>>
Hive Explain(翻译自Hive wiki)
查看>>
day4-RHCS
查看>>
.NET代码设计简单规范
查看>>
Microsoft.AspNet.SignalR实现弹幕(即时通讯)
查看>>
菜鸡互啄队 --- 第三周-需求改进&系统设计
查看>>
面向对象的多态
查看>>
配置Apache虚拟目录
查看>>
02.驱动调试
查看>>